import java.util.Random;

/**
 * Weather天气类
 * 2017-10-13
 * @author Erik
 * @version 0.1
 * @since JDK1.8 IDEA
 * 用于湿度和温度数据的存放和读取
 * 天气类Weather，包含int类型的温度（temperature）和湿度（humidity）属性，以及布尔类型的属性flag用于判断是生成还是读取天气信息。
方法包括：
（1）    温度和湿度属性的getter和setter方法
（2）    生成天气数据的方法public void generate()
使用随机数获取0-40度之间的温度，0-100之间的湿度
（3）   读取天气数据的方法public void read()
（4）   重写toString()方法
 */
public class Weather {
    private double temperature; //温度
    private double humidity;    //湿度
    private boolean flag=true; //线程标志,false代表线程中产生数据，true代表线程中没产生数据

    private double getTemperature() {
        return this.temperature;
    }

    private double getHumidity() {
        return this.humidity;
    }

    private void setHumidity(double humidity) {
        this.humidity = humidity;
    }

    private void setTemperature(double temperature) {
        this.temperature = temperature;
    }

    /**
     * 用于生成天气数据
     * 通过随机数生成天气数据，并输出
     */
    synchronized void generate(){
       /*如果线程中已经产生了数据，则线程休眠*/
        if(!flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        int min=0;
        int maxTemp=40;
        int maxHumid=100;

        int boundTemp=(maxTemp-min+1)+min;
        int boundHumid=(maxHumid-min+1)+min;

        Random random=new Random();
        setTemperature(random.nextInt(maxTemp)%boundTemp);
        setHumidity(random.nextInt(maxHumid)%boundHumid);
        System.out.println("生成天气数据"+this.toString());
        flag=false;  //已经生成数据
        notifyAll();//唤醒所有进程
    }

    @Override
    public String toString() {
        return "[温度:"+this.getTemperature()+",湿度:"+this.getHumidity()+"]";
    }
    /**
     * 读取天气数据
     */
    synchronized void read(){
        /*如果线程中已经没有数据产生，则休眠*/
        if(flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("读取天气数据"+this.toString());
        flag=true; //已经读取数据
        notifyAll();//唤醒所有进程
    }
}
